package com.hht;

import java.util.concurrent.Phaser;

/**
 * @Author chengpunan
 * @Description //分阶段运行，和 CountDownLatch CyclicBarrier 有部分重叠，但是可以分阶段完成任务
 * 所有注册的线程都完成同一阶段后进入下一阶段
 * @Date 8:53 2019/2/20
 * @Param
 * @return
 **/
public class PhaserDemo {

	public static void main(String[] args) {
		
		Phaser phaser = new Phaser();
		
		System.out.println("starting ...");
		
		//在Worker中只是执行、等待
		new Worker(phaser, "Fuwuyuan").start();
		new Worker(phaser, "Chushi").start();
		new Worker(phaser, "Shangcaiyuan").start();
		
		//表示一个有三个订单，对于每一个订单，都需要所有人处理完毕后，才能继续执行
		for(int i=1; i<=3; i++) {
			phaser.arriveAndAwaitAdvance();//自已处理完了，等待其它线程处理完才能继续进行
			System.out.println("Order " + i + " finished!");
		}
		
		//所有订单执行完毕后，解除所有注册的线程
		phaser.arriveAndDeregister();
		System.out.println("All done!");
	}
}

class Worker extends Thread {
	
	private Phaser phaser;
	
	public Worker(Phaser phaser, String name) {
		this.setName(name);
		this.phaser = phaser;
		//把当前线程注册到phaser中
		phaser.register();
	}
	
	public void run() {
		for(int i=1;i<= 3;i++) {
			System.out.println("current order is :" + i + ":" + getName());
			if(i == 3) {
				//如果三个订单都处理完成，则解除注销
				phaser.arriveAndDeregister();
			}else {
				//如果还有其它订单未处理完，则等待其它订单处理完毕
				phaser.arriveAndAwaitAdvance();
			}
			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
}